package br.ufrj.dcc.ad.generators;

import java.util.Calendar;
import java.util.Random;

public class NormalTimeGenerator extends TimeGenerator{
	private Random random;
	private double media;
	private double desvioPadrao;
	
	public NormalTimeGenerator(double media, double desvioPadrao) {
		this.media = media;
		this.desvioPadrao = desvioPadrao;
		random = new Random(Calendar.getInstance().getTimeInMillis());
	}
	
	public NormalTimeGenerator(double periodo,double taxa,double media,double desvioPadrao){
		this.media = media;
		this.desvioPadrao = desvioPadrao;
		random = new Random(Calendar.getInstance().getTimeInMillis());
	}

	/**
	 * random.nextGaussian() gera uma normal(0,1) e portanto devemos despadronizar o resultado.
	 * Como para padronizar fazemos Z = (X - Media)/desvio padrao, temos que X = Media + Z*desvio padrao.
	 * @param z um número de uma distribuição normal(0,1). 
	 * @return O número despadronizado.
	 */
	private double despadroniza(double z){
		return media + (z*desvioPadrao);
	}

	@Override
	public double geraAmostra() {
		return truncate(despadroniza(random.nextGaussian()));
	}
	
	@Override
	public double geraAmostra(double tempoAtual) {
		return tempoAtual + truncate(despadroniza(random.nextGaussian()));
	}
	private double truncate(double valor){
		return Math.abs(valor);
	}

	@Override
	public void resetSeed() {
		//random = new Random(Calendar.getInstance().getTimeInMillis());
		random = new Random(random.nextLong());
	}
}
